const db = require('../db/index')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const config = require('../config')

//注册用户的处理函数
exports.regUser = (req, res) => {
    //获取客户端提交到服务器的用户信息
    const userinfo = req.body
    console.log(userinfo);
    //对表单中的数据进行合法性判断
    //1. 判断用户名和密码是否非空
    if(!userinfo.username || !userinfo.password)
    {
        // return res.send({status:1, message:'用户名或密码不能为空!'})
        return res.cc('用户名或密码不能为空!')
    }

    //2. 检测用户名是否被占用(db 操作)
    const sql = `select * from ev_user where username=?`
    db.query(sql, [userinfo.username], function(err, results){
        //执行sql语句失败
        if(err){
            //return res.send({status:1, message: err.message})
            return res.cc(err)
        }
        //用户名被占用
        if(results.length > 0){
            // return res.send({status: 1, message: '用户已被注册，请更换其他用户名!'})
            return res.cc('用户已被注册，请更换其他用户名!')
        }
        //用户名可以使用
        //对用户密码进行加密
        userinfo.password = bcrypt.hashSync(userinfo.password, 10)
        //定义插入用户的sql语句
        const sql2 = 'insert into ev_user set ?'
        db.query(sql2, {username: userinfo.username, password: userinfo.password }, (err, results) => {
            if(err)
            {
                // return res.send({status:1, message: err.message})
                return res.cc(err)
            }
            //判断影响行数是否为1
            if(results.affectedRows != 1) 
            {
                // return res.send({status:1, message:"注册失败，请稍后再试！"})
                return res.cc('注册失败，请稍后再试！')
            }

            //注册用户成功
            // res.send({status:0, message:"注册成功"})
            res.cc('注册成功', 0)

        })
    })

    // res.send('reguser ok')
}


//登录的处理函数
exports.login = (req, res) => {
    //获取客户端提交到服务器的用户信息
    const userinfo = req.body
    //判断是否为空
    if(!userinfo.username || !userinfo.password)
    {
        // return res.send({status:1, message:'用户名或密码不能为空!'})
        return res.cc('用户名或密码不能为空!')
    }
    const sql = `select * from ev_user where username = ?`
    db.query(sql, [userinfo.username], function(err, results){
        
        //执行sql语句失败
        if(err) return res.cc(err)
        
        //执行sql语句成功，但是查询到的数据库数据条数不为1
        if(results.length !== 1) return res.cc('登录失败')

        //判断用户登录使用的密码是否和数据库一致
        //拿着用户输入的密码，和数据库存储的密码进行对比
        const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
        //如果对比结果等于false，则证明用户书的密码错误
        if(!compareResult) {
            return res.cc('登录失败!')
        }
        //登录成功，生成Token字符串
        const user = {...results[0], password: '', user_pic: ''}  //password和user_pic将results中的覆盖掉
        const tokenStr = jwt.sign(user, config.jwtSecretKey, {
            expiresIn: config.expiresIn, //token的有效期为10h
        })
        // console.log(tokenStr);
        res.send({
            status: 0,
            message: '登录成功！',
            //为了方便客户端使用Token，在服务器端直接拼接上Bearer的前缀
            token: 'Bearer ' + tokenStr
        })



    })
    
}

